/* global $, events, eventLeftMargin, canvasBufferTimeRangeUpdate, canvasBufferWindowUpdate, canvasBitrateEventUpdate,
   canvasVideoEventUpdate, canvasLoadEventUpdate */
/* eslint no-var: 0 */
var windowDuration = 20000;
var windowSliding = true;
var windowStart = 0;
var windowEnd = 10000;
var windowFocus;
var metricsDisplayed = false;
var timeRangeMouseDown = false;

$('#windowStart').val(windowStart);
$('#windowEnd').val(windowEnd);

function showMetrics () {
  metricsDisplayed = true;
  var width = window.innerWidth - 30;
  $('#bufferWindow_c')[0].width =
    $('#bitrateTimerange_c')[0].width =
    $('#bufferTimerange_c')[0].width =
    $('#videoEvent_c')[0].width =
    $('#metricsButton')[0].width =
    $('#loadEvent_c')[0].width = width;
  $('#bufferWindow_c').show();
  $('#bitrateTimerange_c').show();
  $('#bufferTimerange_c').show();
  $('#videoEvent_c').show();
  $('#metricsButton').show();
  $('#loadEvent_c').show();
}

function hideMetrics () {
  metricsDisplayed = false;
  $('#bufferWindow_c').hide();
  $('#bitrateTimerange_c').hide();
  $('#bufferTimerange_c').hide();
  $('#videoEvent_c').hide();
  $('#metricsButton').hide();
  $('#loadEvent_c').hide();
}

function timeRangeSetSliding (duration) {
  windowDuration = duration;
  windowSliding = true;
  refreshCanvas();
}

function timeRangeCanvasonMouseDown (evt) {
  var canvas = evt.currentTarget;
  var bRect = canvas.getBoundingClientRect();
  var mouseX = Math.round((evt.clientX - bRect.left) * (canvas.width / bRect.width));
  windowStart = Math.max(0, Math.round((mouseX - eventLeftMargin) * getWindowTimeRange().now / (canvas.width - eventLeftMargin)));
  windowEnd = windowStart + 500;
  timeRangeMouseDown = true;
  windowSliding = false;
  // console.log('windowStart/windowEnd:' + '/' + windowStart + '/' + windowEnd);
  $('#windowStart').val(windowStart);
  $('#windowEnd').val(windowEnd);
  refreshCanvas();
}

function timeRangeCanvasonMouseMove (evt) {
  if (timeRangeMouseDown) {
    var canvas = evt.currentTarget;
    var bRect = canvas.getBoundingClientRect();
    var mouseX = Math.round((evt.clientX - bRect.left) * (canvas.width / bRect.width));
    var pos = Math.max(0, Math.round((mouseX - eventLeftMargin) * getWindowTimeRange().now / (canvas.width - eventLeftMargin)));
    if (pos < windowStart) {
      windowStart = pos;
    } else {
      windowEnd = pos;
    }
    if (windowStart === windowEnd) {
      // to avoid division by zero ...
      windowEnd += 50;
    }
    // console.log('windowStart/windowEnd:' + '/' + windowStart + '/' + windowEnd);
    $('#windowStart').val(windowStart);
    $('#windowEnd').val(windowEnd);
    refreshCanvas();
  }
}

function timeRangeCanvasonMouseUp (evt) {
  timeRangeMouseDown = false;
}

function timeRangeCanvasonMouseOut (evt) {
  timeRangeMouseDown = false;
}

function windowCanvasonMouseMove (evt) {
  var canvas = evt.currentTarget;
  var bRect = canvas.getBoundingClientRect();
  var mouseX = Math.round((evt.clientX - bRect.left) * (canvas.width / bRect.width));
  var timeRange = getWindowTimeRange();
  windowFocus = timeRange.min + Math.max(0, Math.round((mouseX - eventLeftMargin) * (timeRange.max - timeRange.min) / (canvas.width - eventLeftMargin)));
  // console.log(windowFocus);
  refreshCanvas();
}

function refreshCanvas () {
  if (metricsDisplayed) {
    try {
      var windowTime = getWindowTimeRange();
      canvasBufferTimeRangeUpdate($('#bufferTimerange_c')[0], 0, windowTime.now, windowTime.min, windowTime.max, events.buffer);
      if (windowTime.min !== 0 || windowTime.max !== windowTime.now) {
        $('#bufferWindow_c').show();
        canvasBufferWindowUpdate($('#bufferWindow_c')[0], windowTime.min, windowTime.max, windowTime.focus, events.buffer);
      } else {
        $('#bufferWindow_c').hide();
      }
      canvasBitrateEventUpdate($('#bitrateTimerange_c')[0], 0, windowTime.now, windowTime.min, windowTime.max, events.level, events.bitrate);
      canvasVideoEventUpdate($('#videoEvent_c')[0], windowTime.min, windowTime.max, events.video);
      canvasLoadEventUpdate($('#loadEvent_c')[0], windowTime.min, windowTime.max, events.load);
    } catch (err) {
      console.log('refreshCanvas error:' + err.message);
    }
  }
}

function getWindowTimeRange () {
  var tnow;
  var minTime;
  var maxTime;
  if (events.buffer.length) {
    tnow = events.buffer[events.buffer.length - 1].time;
  } else {
    tnow = 0;
  }
  if (windowSliding) {
    // let's show the requested window
    if (windowDuration) {
      minTime = Math.max(0, tnow - windowDuration);
      maxTime = Math.min(minTime + windowDuration, tnow);
    } else {
      minTime = 0;
      maxTime = tnow;
    }
  } else {
    minTime = windowStart;
    maxTime = windowEnd;
  }
  if (windowFocus === undefined || windowFocus < minTime || windowFocus > maxTime) {
    windowFocus = minTime;
  }
  return { min: minTime, max: maxTime, now: tnow, focus: windowFocus };
}

function timeRangeZoomIn () {
  if (windowSliding) {
    windowDuration /= 2;
  } else {
    var duration = windowEnd - windowStart;
    windowStart += duration / 4;
    windowEnd -= duration / 4;
    if (windowStart === windowEnd) {
      windowEnd += 50;
    }
  }
  $('#windowStart').val(windowStart);
  $('#windowEnd').val(windowEnd);
  refreshCanvas();
}

function timeRangeZoomOut () {
  if (windowSliding) {
    windowDuration *= 2;
  } else {
    var duration = windowEnd - windowStart;
    windowStart -= duration / 2;
    windowEnd += duration / 2;
    windowStart = Math.max(0, windowStart);
    windowEnd = Math.min(events.buffer[events.buffer.length - 1].time, windowEnd);
  }
  $('#windowStart').val(windowStart);
  $('#windowEnd').val(windowEnd);
  refreshCanvas();
}

function timeRangeSlideLeft () {
  var duration = windowEnd - windowStart;
  windowStart -= duration / 4;
  windowEnd -= duration / 4;
  windowStart = Math.max(0, windowStart);
  windowEnd = Math.min(events.buffer[events.buffer.length - 1].time, windowEnd);
  $('#windowStart').val(windowStart);
  $('#windowEnd').val(windowEnd);
  refreshCanvas();
}

function timeRangeSlideRight () {
  var duration = windowEnd - windowStart;
  windowStart += duration / 4;
  windowEnd += duration / 4;
  windowStart = Math.max(0, windowStart);
  windowEnd = Math.min(events.buffer[events.buffer.length - 1].time, windowEnd);
  $('#windowStart').val(windowStart);
  $('#windowEnd').val(windowEnd);
  refreshCanvas();
}
